<html>
    <head>
        <title>
            简单状态检查器
        </title>
    </head>
    <body>
        <script>
            // 简单状态检查器   Simple State Checker

                /*
                    简单状态检查系统可用于根据某些动态条件启用/禁用对象。 

                    例如，如果当前用户没有授予给定权限，你可以禁用用户交互界面上的菜单项。简单状态检查系统提供了定义和检查此类条件的通用方法。
                */

                /*
                    一、定义状态检查器

                            任何类都可以继承IHasSimpleStateCheckers以支持"状态检查"。

                                public class MyObject : IHasSimpleStateCheckers<MyObject>
                                {
                                    public int  Id { get; set; }

                                    public List<ISimpleStateChecker<MyObject>> SimpleStateCheckers { get; }

                                    public MyObject()
                                    {
                                        SimpleStateCheckers = new List<ISimpleStateChecker<MyObject>>();
                                    }
                                }


                            MyObject类包含状态检查器的集合，你可以将自定义检查器添加到其中。

                                // 定义状态检查器
                                public class MyObjectStateChecker : ISimpleStateChecker<MyObject>  // 实现ISimpleStateChecker接口，以便检查MyObject的状态。
                                {
                                    public Task<bool> IsEnabledAsync(SimpleStateCheckerContext<MyObject> context)
                                    {
                                        var currentUser = context.ServiceProvider.GetRequiredService<ICurrentUser>();
                                        return Task.FromResult(currentUser.IsInRole("Admin"));
                                    }
                                }


                                var myobj = new MyObject()
                                {
                                    Id = 100
                                };

                                myobj.SimpleStateCheckers.Add(new MyObjectStateChecker()); // 将状态检查器添加到MyObject实例。
                */

                /*
                    二、定义全局状态检查器

                               AbpSimpleStateCheckerOptions 是用于为"特定对象"设置全局状态检查器的选项类 

                               eg:  为MyObject添加全局状态检查器

                                        services.Configure<AbpSimpleStateCheckerOptions<MyObject>>(options =>
                                        {
                                            options.GlobalSimpleStateCheckers.Add<MyGlobalObjectStateChecker>();
                                            //options.GlobalSimpleStateCheckers.Add<>(); //Add more global state checkers
                                        });

                                将其写入模块的ConfigureServices方法中。
                */

                /*
                    三、检查状态

                          1、ISimpleStateCheckerManager<MyObject>  单个状态检查器管理器服务

                                你可以注入ISimpleStateCheckerManager<MyObject> (单个状态检查器管理器服务)来检查状态:

                                        bool enabled = await stateCheckerManager.IsEnabledAsync(myobj);

                          2、批量检查状态 ISimpleBatchStateChecker

                                如果有许多实例项需要状态检查，则可能存在性能问题。

                                在这种情况下，你可以实现ISimpleBatchStateChecker。

                                它可以一次检查多个项目。需要确保相同的ISimpleBatchStateChecker实例被添加到多个实例的SimpleStateCheckers。

                                    SimpleBatchStateCheckerBase继承ISimpleBatchStateChecker接口，默认实现单个对象的IsEnabledAsync方法。

                                eg：

                                    public class MyObjectBatchStateChecker : SimpleBatchStateCheckerBase<MyObject>
                                    {
                                        public override Task<SimpleStateCheckerResult<MyObject>> IsEnabledAsync(SimpleBatchStateCheckerContext<MyObject> context)
                                        {
                                            var result = new SimpleStateCheckerResult<MyObject>(context.States);

                                            foreach (var myObject in context.States)
                                            {
                                                if (myObject.Id > 100)
                                                {
                                                    result[myObject] = true;
                                                }
                                            }

                                            return Task.FromResult(result);
                                        }
                                    }


                                    var myobj1 = new MyObject()
                                    {
                                        Id = 100
                                    };
                                    var myobj2 = new MyObject()
                                    {
                                        Id = 99
                                    };

                                    var myObjectBatchStateChecker = new MyObjectBatchStateChecker();

                                    myobj1.SimpleStateCheckers.Add(myObjectBatchStateChecker);
                                    myobj2.SimpleStateCheckers.Add(myObjectBatchStateChecker);

                                    SimpleStateCheckerResult<MyObject> stateCheckerResult = await stateCheckerManager.IsEnabledAsync(new []{ myobj1, myobj2 });
                */

                /*
                    四、内置状态检查器

                            PermissionDefinition、ApplicationMenuItem和ToolbarItem对象实现了状态检查，并内置了通用状态检查器，你可以直接使用它们的扩展方法。

                                        RequireAuthenticated();
                                        RequirePermissions(bool requiresAll, params string[] permissions);
                                        RequireFeatures(bool requiresAll, params string[] features);
                                        RequireGlobalFeatures(bool requiresAll, params Type[] globalFeatures);
                */
        </script>
    </body>
</html>